package lz.controls
{
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.text.TextFormat;
	import flash.ui.Keyboard;

	/**
	 * ToggleButtonBar 控件定义一组水平或垂直按钮，这些按钮保持其选中或取消选中状态。
	 * 在 ToggleButtonBar 控件中，只有一个按钮可以处于选中状态。
	 * 这就意味着，当用户在 ToggleButtonBar 控件中选择一个按钮后，该按钮将保持选中状态直到用户选择其他按钮。
	 * 如果将 ToggleButtonBar 容器的 toggleOnClick 属性设置为 true，则选择当前选中的按钮将取消其选中状态。默认情况下，toggleOnClick 属性设置为 false。
	 * 您可以使用 ButtonBar 控件定义一组按压按钮。
	 */
	public class ToggleButtonBar extends ButtonBar
	{
		
		public function ToggleButtonBar()
		{
			super();
		}
		/**
		 * 所选按钮的索引。
		 */
		private var _selectedIndex:int=-2;
		/**
		 *  所选按钮的索引是否改变
		 */
		private var selectedIndexChanged:Boolean=false;

		/**
		 * 获取设置 所选按钮的索引
		 */
		override public function get selectedIndex():int
		{
			return super.selectedIndex;
		}
		override public function set selectedIndex(value:int):void
		{
			//#SDK-15690 - if the user has asked for -1 (no child selected) then we must preserve this
			if (value == selectedIndex && value != -1)
				return;

			// If the buttons have not been created yet, store the selectedIndex.
			if (numChildren == 0)
			{
				_selectedIndex=value;
				selectedIndexChanged=true;
			}

			// Otherwise set the index locally and invalidate properties.
			if (value < numChildren)
			{
				_selectedIndex=value;
				selectedIndexChanged=true;
			}
		}
		/**
		 * 指定用户是否可以取消对当前所选按钮的选择。
		 */
		private var _toggleOnClick:Boolean=false;
		/**
		 * 指定用户是否可以取消对当前所选按钮的选择。
		 * 默认情况下，仅当选中该组中的其他按钮时，才会自动取消对当前所选按钮的选择。
		 * 将此属性设置为 true 将允许用户取消对当前所选按钮的选择。
		 * 取消对当前所选按钮的选择后，selectedIndex 属性将设置为 -1。
		 * 默认值为 false。
		 */
		public function get toggleOnClick():Boolean
		{
			return _toggleOnClick;
		}
		public function set toggleOnClick(value:Boolean):void
		{
			_toggleOnClick=value;
		}
		/**
		 * 创建按钮组中的按钮
		 */
		override protected function createNavItem(label:String, textFormat:TextFormat=null, icon:Class=null):Button
		{
			var b:Button=Button(super.createNavItem(label, textFormat, icon));
			b.toggle=true;
			return b;
		}
		/**
		 * 处理（醒目）选择条目
		 */
		protected function hiliteSelectedNavItem(index:int):void
		{
			var child:Button;
			// Un-hilite the current selection
			if (selectedIndex != -1 && selectedIndex < numChildren)
			{
				child=Button(getChildAt(selectedIndex));
				child.selected=false;
			}
			// Set new index
			super.selectedIndex=index;
			_selectedIndex=index;
			if (index > -1)
			{
				// Hilite the new selection
				child=Button(getChildAt(selectedIndex));
				child.selected=true;
			}
		}
		/**
		 * 选择特定索引的按钮
		 */
		protected function selectButton(index:int, updateFocusIndex:Boolean=false, trigger:Event=null):void
		{
			_selectedIndex=index;

			var child:Button=Button(getChildAt(index));
			child.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
		}
		//--------------------------------------------------------------------------
		//
		//  Overridden event handlers: UIComponent
		//
		//--------------------------------------------------------------------------
		/**
		 *  键盘按下
		 */
		override protected function keyDownHandler(event:KeyboardEvent):void
		{
			var targetIndex:int=-1;
			var updateFocusIndex:Boolean=true;
			var n:int=numChildren;

			switch (event.keyCode)
			{
				case Keyboard.PAGE_DOWN:
				{
					//targetIndex = nextIndex(selectedIndex);
					break;
				}

				case Keyboard.PAGE_UP:
				{
					if (selectedIndex != -1)
					{
						//targetIndex = prevIndex(selectedIndex);
					}
					else if (n > 0)
					{
						targetIndex=0;
					}
					break;
				}

				case Keyboard.HOME:
				{
					if (n > 0)
						targetIndex=0;
					break;
				}

				case Keyboard.END:
				{
					if (n > 0)
						targetIndex=n - 1;
					break;
				}

				case Keyboard.SPACE:
				case Keyboard.ENTER:
				{
					break;
				}

				default:
				{
					super.keyDownHandler(event);
				}
			}

			if (targetIndex != -1)
			{
				selectButton(targetIndex, updateFocusIndex, event);
			}

			event.stopPropagation();
		}
		/**
		 *  键盘松开
		 */
		override protected function keyUpHandler(event:KeyboardEvent):void
		{
			// Override superclass's keyUpHandler() but do nothing.
		}
		/**
		 *点击事件
		 */
		override protected function clickHandler(event:MouseEvent):void
		{
			var index:int=getChildIndex(Button(event.currentTarget));

			// 143958
			_selectedIndex=index;

			if (_toggleOnClick && index == selectedIndex)
			{
				selectedIndex=-1;
				hiliteSelectedNavItem(-1);
			}
			else
				hiliteSelectedNavItem(index);
			super.clickHandler(event);
		}
	}
}
